<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>闭包</title>
</head>

<body>
    <script>
        
        /*   
            闭包函数概念： 函数里面套函数，在一个函数内部有权访问另外一个函数内部的变量或参数，
            把函数内部的函数返回，在外面被调用返回函数时，产生闭包 
        */
       /* 
            缺点：由于闭包会使用函数中的变量一直被保存在内存中，不能及时销毁，内存消耗很大，易引起内存泄露
       */

       /* 
            优点： 延伸了变量的作用范围 ，避免全局变量的污染
       */

       // 闭包函数
        function fn() {
            var count = 1;
            return function () {   //返回值嵌套函数  形成闭包
                count++;
                console.log(count);
            }
        }
        console.log(fn());  // 打印嵌套的函数
        console.log(fn()()); // 2 undefined
                            // 先打印嵌套函数体中的 log  ,因为没有返回值  后面返回 undefined
        var count = fn();
        count(); // 2  打印一次
        count(); // 3  打印两次  上一次运行结果 没有被清除 保留  闭包


        function show() {
            var a = 10;
            return function () {    //产生闭包
                a++;
                console.log(a);
            };
        }
        var show1 = show();   
        show1();
        show1();
        show1();

    </script>
</body>

</html>